package co.edu.uniquindio.ondas.negocio;

import java.util.Date;
import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import co.edu.uniquindio.ondas.daos.ActividadDAO;
import co.edu.uniquindio.ondas.daos.Bitacora1MaestroDAO;
import co.edu.uniquindio.ondas.daos.Bitacora2DAO;
import co.edu.uniquindio.ondas.daos.Bitacora2MaestroDAO;
import co.edu.uniquindio.ondas.daos.Bitacora3DAO;
import co.edu.uniquindio.ondas.daos.Bitacora3MaestroDAO;
import co.edu.uniquindio.ondas.daos.Bitacora4MaestroDAO;
import co.edu.uniquindio.ondas.daos.Bitacora5DAO;
import co.edu.uniquindio.ondas.daos.ComentarioAsesorDAO;
import co.edu.uniquindio.ondas.daos.ComentarioDAO;
import co.edu.uniquindio.ondas.daos.ConsultaDAO;
import co.edu.uniquindio.ondas.daos.ConvocatoriaDAO;
import co.edu.uniquindio.ondas.daos.CronogramaDAO;
import co.edu.uniquindio.ondas.daos.EncuestaDAO;
import co.edu.uniquindio.ondas.daos.EstudianteDAO;
import co.edu.uniquindio.ondas.daos.GrupoDAO;
import co.edu.uniquindio.ondas.daos.InformeAvanceTecnicoDAO;
import co.edu.uniquindio.ondas.daos.InformeFinalDAO;
import co.edu.uniquindio.ondas.daos.InvestigacionDAO;
import co.edu.uniquindio.ondas.daos.LineaTematicaDAO;
import co.edu.uniquindio.ondas.daos.MaestroDAO;
import co.edu.uniquindio.ondas.daos.RespuestaComentarioDAO;
import co.edu.uniquindio.ondas.daos.RespuestaConsultaDAO;
import co.edu.uniquindio.ondas.daos.SedeDAO;
import co.edu.uniquindio.ondas.daos.SegmentoDAO;
import co.edu.uniquindio.ondas.daos.VisitaProgramadaDAO;
import co.edu.uniquindio.ondas.dtos.ResumenComentarioDTO;
import co.edu.uniquindio.ondas.dtos.ResumenInvestigacionGrupoDTO;
import co.edu.uniquindio.ondas.entidades.Actividad;
import co.edu.uniquindio.ondas.entidades.Asesor;
import co.edu.uniquindio.ondas.entidades.Bitacora1Maestro;
import co.edu.uniquindio.ondas.entidades.Bitacora2;
import co.edu.uniquindio.ondas.entidades.Bitacora2Maestro;
import co.edu.uniquindio.ondas.entidades.Bitacora3;
import co.edu.uniquindio.ondas.entidades.Bitacora3Maestro;
import co.edu.uniquindio.ondas.entidades.Bitacora4Maestro;
import co.edu.uniquindio.ondas.entidades.Bitacora5;
import co.edu.uniquindio.ondas.entidades.Comentario;
import co.edu.uniquindio.ondas.entidades.ComentarioAsesor;
import co.edu.uniquindio.ondas.entidades.Consulta;
import co.edu.uniquindio.ondas.entidades.Convocatoria;
import co.edu.uniquindio.ondas.entidades.Cronograma;
import co.edu.uniquindio.ondas.entidades.Encuesta;
import co.edu.uniquindio.ondas.entidades.Estudiante;
import co.edu.uniquindio.ondas.entidades.Grupo;
import co.edu.uniquindio.ondas.entidades.InformeAvanceTecnico;
import co.edu.uniquindio.ondas.entidades.InformeFinal;
import co.edu.uniquindio.ondas.entidades.Investigacion;
import co.edu.uniquindio.ondas.entidades.LineaTematica;
import co.edu.uniquindio.ondas.entidades.Maestro;
import co.edu.uniquindio.ondas.entidades.RespuestaComentario;
import co.edu.uniquindio.ondas.entidades.RespuestaConsulta;
import co.edu.uniquindio.ondas.entidades.Sede;
import co.edu.uniquindio.ondas.entidades.Segmento;
import co.edu.uniquindio.ondas.entidades.VisitaProgramada;

/**
 * Session Bean implementation class GrupoEJB
 * Implementacion de las operaciones del EJB Grupo
 */
@Stateless
public class GrupoEJB implements GrupoEJBRemote, GrupoEJBLocal {

	/**
	 * Manejador de Persistencia
	 */
	@PersistenceContext(unitName = "proyectoEJB")
	protected EntityManager entityManager;

	/**
	 * DAO de la Sede
	 */
	private SedeDAO sedeDAO;
	/**
	 * DAO del Grupo
	 */
	private GrupoDAO grupoDAO;
	/**
	 * DAO del Estudiante
	 */
	private EstudianteDAO estudianteDAO;
	/**
	 * DAO del Maestro
	 */
	private MaestroDAO maestroDAO;
	/**
	 * DAO de la Bitacora2DAO
	 */
	private Bitacora2DAO bitacora2DAO;
	/**
	 * DAO de la Investigacion 
	 */
	private InvestigacionDAO investigacionDAO;
	/**
	 * DAO de la Linea Tematica
	 */
	private LineaTematicaDAO lineaTematicaDAO;

	/**
	 * DAO de la Bitacota3DAO
	 */
	private Bitacora3DAO bitacora3DAO;
	/**
	 * DAO de la Bitacora1MaestroDAO
	 */
	private Bitacora1MaestroDAO bitacora1MaestroDAO;
	/**
	 * DAO de la Bitacora2MaestroDAO
	 */
	private Bitacora2MaestroDAO bitacora2MaestroDAO;
	/**
	 * DAO de la Bitacora3MaestroDAO
	 */
	private Bitacora3MaestroDAO bitacora3MaestroDAO;
	/**
	 * DAO de la Bitacora4MaestroDAO
	 */
	private Bitacora4MaestroDAO bitacora4MaestroDAO;
	/**
	 * DAO del InformeAvanceTecnico
	 */
	private InformeAvanceTecnicoDAO informeAvanceTecnicoDAO;
	/**
	 * DAO de la Visita Programada
	 */
	private VisitaProgramadaDAO visitaProgramadaDAO;

	/**
	 * DAO de la Actividad
	 */
	private ActividadDAO actividadDAO;
	/**
	 * DAO del Informe Final
	 */
	private InformeFinalDAO informeFinalDAO;

	/**
	 * DAO de la Bitacora5
	 */
	private Bitacora5DAO bitacora5dao;
	/**
	 * DAO del Segmento 
	 */
	private SegmentoDAO segmentoDAO;

	/**
	 * DAO del cronograma
	 */
	private CronogramaDAO cronogramaDAO;

	/**
	 * DAO de la consulta
	 */
	private ConsultaDAO consultaDAO;
	/**
	 * DAO de la respuesta Consulta
	 */
	private RespuestaConsultaDAO respuestaConsultaDAO;

	/**
	 * DAO comentario Asesor
	 */
	private ComentarioAsesorDAO comentarioAsesorDAO;

	/**
	 * DAO de la Encuesta
	 */
	private EncuestaDAO encuestaDAO;

	/**
	 * DAO comentario
	 */
	private ComentarioDAO comentarioDAO;

	/**
	 * DAO respuesta comentario
	 */
	private RespuestaComentarioDAO respuestaComentarioDAO;
	
	/**
	 * DAO convocatoria
	 */
	private ConvocatoriaDAO convocatoriaDAO;
	
	// private List<Grupo> listaGrupo;

	// private Grupo grupoClave;

	/**
	 * Metodo constructor 
	 */
	public GrupoEJB() {

	}

	public boolean inicioSesionGrupo(String login, String clave) {

		boolean autenticado = false;
		grupoDAO = new GrupoDAO(entityManager);

		List<Grupo> listaGrupos = grupoDAO.getAll();
		// grupoClave=grupoDAO.findByKey(clave);

		for (int i = 0; i < listaGrupos.size(); i++) {

			if (listaGrupos.get(i).getLogin().equals(login)) {
				if (listaGrupos.get(i).getClave().equals(clave)) {
					autenticado = true;
					break;

				}
			}

		}

		return autenticado;

	}

	/** esta es la bitacora de la inscripcion de un grupo */
	public String crearBitacora1Grupo(Grupo grupo, String nombreSede,
			String nombreMunicipio) {
		String mensaje="";
		boolean existe = false;
		grupoDAO = new GrupoDAO(entityManager);
		sedeDAO = new SedeDAO(entityManager);
		convocatoriaDAO=new ConvocatoriaDAO(entityManager);
		Convocatoria convocatoria;
		
		List<Convocatoria> convocatorias=convocatoriaDAO.obtenerConvocatoriaActiva();
		if (convocatorias.size()!=0) {
			convocatoria=convocatorias.get(0);
			
			
			Date fechaActual=new Date();
			Date inicio=convocatoria.getInicioPreinscripcion();
			Date fin=convocatoria.getFinPreinscripcion();
			
			double inIncripcion=fechaActual.getTime()-inicio.getTime();
			double inIncripcion1=inIncripcion/86400000;
			
			double finIncripcion=fin.getTime()-fechaActual.getTime();
			double finIncripcion1=finIncripcion/86400000;
			
			if (inIncripcion1>=0 && finIncripcion1>=-1) {
				List<Grupo> listaGrupo = grupoDAO.getAll();

				if (listaGrupo.size() != 0) {
					for (int i = 0; i < listaGrupo.size(); i++) {

						if (listaGrupo.get(i).getLogin().equals(grupo.getLogin())) {

							existe = true;
							break;
						}

					}

				Sede sede = sedeDAO.getSedeNombre(nombreSede, nombreMunicipio);

				if (existe != true) {
					grupo.setSede(sede);
					grupoDAO.insert(grupo);
					mensaje="Grupo Creado";
				}else
					mensaje="Login Repetido";
			}else{
				Sede sede = sedeDAO.getSedeNombre(nombreSede, nombreMunicipio);
				grupo.setSede(sede);
				grupoDAO.insert(grupo);
				mensaje="Grupo Creado";
			}
			}else
				mensaje="Fecha No Permitida";
			
				
		}else
			mensaje="No hay fecha de convocatoria";
		return mensaje;
	}

	public boolean crearEstudianteGrupo(Estudiante estudiante, String grupoLogin) {

		boolean creado = false;
		boolean existe = false;

		grupoDAO = new GrupoDAO(entityManager);
		estudianteDAO = new EstudianteDAO(entityManager);
		List<Estudiante> estudiantes = estudianteDAO.getAll();

		if (estudiantes.size() != 0) {
			for (int i = 0; i < estudiantes.size(); i++) {
				if (estudiantes.get(i).getIdentificacion()
						.equals(estudiante.getIdentificacion())) {
					existe = true;
					break;
				}

			}

		}
		if (!existe) {

			Grupo grupo = grupoDAO.getGrupo(grupoLogin);
			estudiante.setGrupo(grupo);
			estudianteDAO.insert(estudiante);
			creado = true;
		}

		return creado;
	}

	public boolean crearMaestroGrupo(Maestro maestro, String grupoLogin) {

		boolean creado = false;
		boolean existe = false;
		maestroDAO = new MaestroDAO(entityManager);
		List<Maestro> maestros = maestroDAO.getAll();

		if (maestros.size() != 0) {
			for (int i = 0; i < maestros.size(); i++) {

				if (maestros.get(i).getIdentificacion()
						.equals(maestro.getIdentificacion())) {
					existe = true;
				}

			}

		}
		if (existe != true) {
			Grupo grupo = grupoDAO.getGrupo(grupoLogin);
			maestro.setGrupo(grupo);
			maestroDAO.insert(maestro);
			creado = true;

		}

		return creado;
	}

	/**
	 * Estas son las actividades o Bitacoras de los grupos que ya pertenecen a
	 * un investigacion
	 */

	public boolean crearBitacora2Grupo(Bitacora2 bitacora2, long idInvestigacion, boolean estado) {

		boolean creado = false;
		// boolean existe = false;

		if (estado) {
			bitacora2DAO = new Bitacora2DAO(entityManager);
			investigacionDAO = new InvestigacionDAO(entityManager);
			convocatoriaDAO = new ConvocatoriaDAO(entityManager);

			Convocatoria convocatoria = new Convocatoria();

			List<Convocatoria> convocatorias = convocatoriaDAO
					.obtenerConvocatoriaActiva();
			if (convocatorias.size() != 0) {
				convocatoria = convocatorias.get(0);

				Date fechaActual = new Date();
				Date inicio = convocatoria.getInicioPropuesta();
				Date fin = convocatoria.getFinPropuesta();

				double inIncripcion = fechaActual.getTime() - inicio.getTime();
				double inIncripcion1 = inIncripcion / 86400000;

				double finIncripcion = fin.getTime() - fechaActual.getTime();
				double finIncripcion1 = finIncripcion / 86400000;

				if (inIncripcion1 >= 0 && finIncripcion1 >= -1) {

					if (bitacora2.getIdentificacion() != 0) {
						bitacora2DAO.update(bitacora2);
						creado = true;
					} else {
						bitacora2DAO.insert(bitacora2);
						/** Busco el id del grupo que tiene iniciada la sesion */
						Investigacion investigacion = investigacionDAO
								.findByKey(idInvestigacion);

						investigacion.setBitacora2(bitacora2);

						/** creo la investigacion */

						investigacionDAO.update(investigacion);
						creado = true;
					}

				}
			}
		}
		

		return creado;
	}

	/**
	 * Este metodo es el encargado de verificar si un grupo especifico posee
	 * investigaciones.
	 * 
	 * @param login
	 *            nombre unico de cada grupo utilizado para el inicio de sesion
	 * @return tieneInvestigacion verificacion del grupo, para saber si
	 *         investigaciones asosiadas o no
	 */
	public boolean tieneInvestigacion(String login) {
		grupoDAO = new GrupoDAO(entityManager);
		boolean sinInvestigacion = false;

		List<String> gruposVacios = grupoDAO.getGruposSinInv();

		for (String string : gruposVacios) {
			if (string.equals(login)) {
				sinInvestigacion = true;
				break;
			}
		}

		return sinInvestigacion;
	}
	
	//falta corregir que si no esta en fecha nodeje crear investigaciones
	
	public ResumenInvestigacionGrupoDTO crearInvestigacion(String login) {
		
		investigacionDAO = new InvestigacionDAO(entityManager);
		grupoDAO = new GrupoDAO(entityManager);
		bitacora5dao = new Bitacora5DAO(entityManager);
		segmentoDAO = new SegmentoDAO(entityManager);
		cronogramaDAO = new CronogramaDAO(entityManager);
		
		convocatoriaDAO = new ConvocatoriaDAO(entityManager);

		Convocatoria convocatoria = new Convocatoria();

		List<Convocatoria> convocatorias = convocatoriaDAO
				.obtenerConvocatoriaActiva();
		if (convocatorias.size() != 0) {
			convocatoria = convocatorias.get(0);

			Date fechaActual = new Date();
			Date inicio = convocatoria.getInicioPropuesta();
			Date fin = convocatoria.getFinPropuesta();

			double inIncripcion = fechaActual.getTime() - inicio.getTime();
			double inIncripcion1 = inIncripcion / 86400000;

			double finIncripcion = fin.getTime() - fechaActual.getTime();
			double finIncripcion1 = finIncripcion / 86400000;

			if (inIncripcion1 >= 0 && finIncripcion1 >= -1) {
				
			}
		}
		
		Grupo grupo = grupoDAO.getGrupo(login);

		Investigacion investigacion = new Investigacion();
		investigacion.setGrupo(grupo);
		investigacion.setActivo(true);

		Bitacora5 bitacora5 = new Bitacora5();
		bitacora5dao.insert(bitacora5);

		Segmento segmento = new Segmento();
		Segmento segmento2 = new Segmento();
		Segmento segmento3 = new Segmento();

		segmento.setBitacora5(bitacora5);
		segmento2.setBitacora5(bitacora5);
		segmento3.setBitacora5(bitacora5);

		segmentoDAO.insert(segmento);
		segmentoDAO.insert(segmento2);
		segmentoDAO.insert(segmento3);

		investigacion.setBitacora5(bitacora5);

		Cronograma cronograma = new Cronograma();

		cronogramaDAO.insert(cronograma);
		investigacion.setCronograma(cronograma);

		investigacionDAO.insert(investigacion);

		ResumenInvestigacionGrupoDTO resumenInvestigacion = null;

		List<ResumenInvestigacionGrupoDTO> resumen = investigacionDAO
				.getInvestigacionGrupo(login);

		if (resumen.size() == 1) {
			resumenInvestigacion = resumen.get(0);
		}

		return resumenInvestigacion;
	}

	public List<ResumenInvestigacionGrupoDTO> getInvestigacionGrupo(String login) {

		investigacionDAO = new InvestigacionDAO(entityManager);

		return investigacionDAO.getInvestigacionGrupo(login);
	}

	public boolean crearBitacora3Grupo(Bitacora3 bitacora3, long inSeleccionada, boolean estado) {

		boolean creado = false;

		if (estado) {
			bitacora3DAO = new Bitacora3DAO(entityManager);
			investigacionDAO = new InvestigacionDAO(entityManager);
			convocatoriaDAO = new ConvocatoriaDAO(entityManager);

			Convocatoria convocatoria = new Convocatoria();

			List<Convocatoria> convocatorias = convocatoriaDAO
					.obtenerConvocatoriaActiva();
			if (convocatorias.size() != 0) {
				convocatoria = convocatorias.get(0);

				Date fechaActual = new Date();
				Date inicio = convocatoria.getInicioPropuesta();
				Date fin = convocatoria.getFinPropuesta();

				double inIncripcion = fechaActual.getTime() - inicio.getTime();
				double inIncripcion1 = inIncripcion / 86400000;

				double finIncripcion = fin.getTime() - fechaActual.getTime();
				double finIncripcion1 = finIncripcion / 86400000;

				if (inIncripcion1 >= 0 && finIncripcion1 >= -1) {
					if (bitacora3.getIdentificacion() != 0) {
						bitacora3DAO.update(bitacora3);
						creado = true;
					} else {
						bitacora3DAO.insert(bitacora3);

						Investigacion investigacion = investigacionDAO
								.findByKey(inSeleccionada);
						investigacion.setBitacora3(bitacora3);

						investigacionDAO.update(investigacion);
						creado = true;
					}
				}
			}
		}
		
		return creado;
	}

	public boolean crearBitacora1Maestro(Bitacora1Maestro bitacora1Maestro,
			long inSeleccionada, boolean estado) {

		boolean creado = false;
		if (estado) {
			bitacora1MaestroDAO = new Bitacora1MaestroDAO(entityManager);
			investigacionDAO = new InvestigacionDAO(entityManager);
			convocatoriaDAO = new ConvocatoriaDAO(entityManager);

			Convocatoria convocatoria = new Convocatoria();

			List<Convocatoria> convocatorias = convocatoriaDAO
					.obtenerConvocatoriaActiva();
			if (convocatorias.size() != 0) {
				convocatoria = convocatorias.get(0);

				Date fechaActual = new Date();
				Date inicio = convocatoria.getInicioPropuesta();
				Date fin = convocatoria.getFinPropuesta();

				double inIncripcion = fechaActual.getTime() - inicio.getTime();
				double inIncripcion1 = inIncripcion / 86400000;

				double finIncripcion = fin.getTime() - fechaActual.getTime();
				double finIncripcion1 = finIncripcion / 86400000;

				if (inIncripcion1 >= 0 && finIncripcion1 >= -1) {

					if (bitacora1Maestro.getIdentificacion() != 0) {
						bitacora1MaestroDAO.update(bitacora1Maestro);
						creado = true;
					} else {
						bitacora1MaestroDAO.insert(bitacora1Maestro);
						Investigacion investigacion = investigacionDAO
								.findByKey(inSeleccionada);
						investigacion.setBitacora1Maestro(bitacora1Maestro);

						/** creo la investigacion */

						investigacionDAO.update(investigacion);
						creado = true;
					}
				}
			}
		}
		
		return creado;
	}

	public boolean crearBitacor2Maestro(Bitacora2Maestro bitacora2Maestro,
			long inSeleccionada, boolean estado) {

		boolean creado = false;
		
		if (estado) {
			bitacora2MaestroDAO = new Bitacora2MaestroDAO(entityManager);
			investigacionDAO = new InvestigacionDAO(entityManager);
			convocatoriaDAO = new ConvocatoriaDAO(entityManager);

			Convocatoria convocatoria = new Convocatoria();

			List<Convocatoria> convocatorias = convocatoriaDAO
					.obtenerConvocatoriaActiva();
			if (convocatorias.size() != 0) {
				convocatoria = convocatorias.get(0);

				Date fechaActual = new Date();
				Date inicio = convocatoria.getInicioPropuesta();
				Date fin = convocatoria.getFinPropuesta();

				double inIncripcion = fechaActual.getTime() - inicio.getTime();
				double inIncripcion1 = inIncripcion / 86400000;

				double finIncripcion = fin.getTime() - fechaActual.getTime();
				double finIncripcion1 = finIncripcion / 86400000;

				if (inIncripcion1 >= 0 && finIncripcion1 >= -1) {

					if (bitacora2Maestro.getIdentificacion() != 0) {
						bitacora2MaestroDAO.update(bitacora2Maestro);
						creado = true;
					} else {
						bitacora2MaestroDAO.insert(bitacora2Maestro);

						Investigacion investigacion = investigacionDAO
								.findByKey(inSeleccionada);
						investigacion.setBitacora2Maestro(bitacora2Maestro);

						/** creo la investigacion */
						investigacionDAO.update(investigacion);
						creado = true;
					}
				}
			}
		}
		

		return creado;
	}

	public boolean crearBitacora3Maestro(Bitacora3Maestro bitacora3Maestro,
			long inSeleccionada, boolean estado) {

		boolean creado = false;
		
		if (estado) {
			bitacora3MaestroDAO = new Bitacora3MaestroDAO(entityManager);
			investigacionDAO = new InvestigacionDAO(entityManager);
			convocatoriaDAO = new ConvocatoriaDAO(entityManager);

			Convocatoria convocatoria = new Convocatoria();

			List<Convocatoria> convocatorias = convocatoriaDAO
					.obtenerConvocatoriaActiva();
			if (convocatorias.size() != 0) {
				convocatoria = convocatorias.get(0);

				Date fechaActual = new Date();
				Date inicio = convocatoria.getInicioPropuesta();
				Date fin = convocatoria.getFinPropuesta();

				double inIncripcion = fechaActual.getTime() - inicio.getTime();
				double inIncripcion1 = inIncripcion / 86400000;

				double finIncripcion = fin.getTime() - fechaActual.getTime();
				double finIncripcion1 = finIncripcion / 86400000;

				if (inIncripcion1 >= 0 && finIncripcion1 >= -1) {

					if (bitacora3Maestro.getIdentficacion() != 0) {
						bitacora3MaestroDAO.update(bitacora3Maestro);
						creado = true;
					} else {
						bitacora3MaestroDAO.insert(bitacora3Maestro);

						/**
						 * Me Obtiene la investigacion en caso de que haya sido
						 * creada por primera vez
						 **/

						Investigacion investigacion = investigacionDAO
								.findByKey(inSeleccionada);
						investigacion.setBitacora3Maestro(bitacora3Maestro);

						investigacionDAO.update(investigacion);
						creado = true;
					}
				}
			}
		}
		
		
		return creado;
	}

	public boolean crearBitacora4Maestro(Bitacora4Maestro bitacora4Maestro,
			long inSeleccionada, boolean estado) {

		boolean creado = true;
		
		if (estado) {
			bitacora4MaestroDAO = new Bitacora4MaestroDAO(entityManager);

			investigacionDAO = new InvestigacionDAO(entityManager);

			if (bitacora4Maestro.getIdentificacion() != 0) {
				bitacora4MaestroDAO.update(bitacora4Maestro);
			} else {
				bitacora4MaestroDAO.insert(bitacora4Maestro);

				Investigacion investigacion = investigacionDAO
						.findByKey(inSeleccionada);

				investigacion.setBitacora4Maestro(bitacora4Maestro);

				investigacionDAO.update(investigacion);
			}
		}
		
		return creado;
	}

	public boolean crearInformeAvanceTecnico(
			InformeAvanceTecnico informeAvanceTecnico, long inSeleccionada, boolean estado) {

		boolean creado = false;
		if (estado) {
			informeAvanceTecnicoDAO = new InformeAvanceTecnicoDAO(entityManager);
			investigacionDAO = new InvestigacionDAO(entityManager);
			
			if (informeAvanceTecnico.getIdentificacion()!=0) {
				informeAvanceTecnicoDAO.update(informeAvanceTecnico);
				creado=true;
			}else {
				informeAvanceTecnicoDAO.insert(informeAvanceTecnico);

				Investigacion investigacion = investigacionDAO
						.findByKey(inSeleccionada);
				investigacion.setiTecnico(informeAvanceTecnico);

				/** creo la investigacion */

				investigacionDAO.update(investigacion);
				creado=true;
			}
		}else
			creado=false;

		return creado;
	}

	public boolean crearFormatoVisitasProgramadas(
			VisitaProgramada visitaProgramada, long inSeleccionada, boolean estado) {
		
		boolean creado = true;
		
		if (estado) {
			visitaProgramadaDAO = new VisitaProgramadaDAO(entityManager);
			investigacionDAO = new InvestigacionDAO(entityManager);
			

			Investigacion investigacion = investigacionDAO
					.findByKey(inSeleccionada);

			visitaProgramada.setInvestigacion(investigacion);

			visitaProgramadaDAO.insert(visitaProgramada);
		}

		return creado;
	}

	public boolean crearSegmento(Segmento segmento1, Segmento segmento2,
			Segmento segmento3, long idInvestigacion, boolean estado) {

		boolean creado = true;
		
		if (estado) {
			bitacora5dao = new Bitacora5DAO(entityManager);
			segmentoDAO = new SegmentoDAO(entityManager);

			Bitacora5 bitacora5Presupuesto = investigacionDAO
					.obtenerBitacora5Investigacion(idInvestigacion);

			long subtotalS1 = segmento1.getTotalCorreo()
					+ segmento1.getTotalDivulgacion()
					+ segmento1.getTotalInsumos()
					+ segmento1.getTotalPapeleria()
					+ segmento1.getTotalRefrigerios()
					+ segmento1.getTotalTransporte();

			segmento1.setTotal(subtotalS1);

			long subtotalS2 = segmento2.getTotalCorreo()
					+ segmento2.getTotalDivulgacion()
					+ segmento2.getTotalInsumos()
					+ segmento2.getTotalPapeleria()
					+ segmento2.getTotalRefrigerios()
					+ segmento2.getTotalTransporte();

			segmento2.setTotal(subtotalS2);

			long subtotalS3 = segmento3.getTotalCorreo()
					+ segmento3.getTotalDivulgacion()
					+ segmento3.getTotalInsumos()
					+ segmento3.getTotalPapeleria()
					+ segmento3.getTotalRefrigerios()
					+ segmento3.getTotalTransporte();

			segmento3.setTotal(subtotalS3);

			long total = subtotalS1 + subtotalS2 + subtotalS3;

			segmento1.setPorcenCorreo((segmento1.getTotalCorreo() * 100)
					/ total);
			segmento1
					.setPorcenDivulgacion((segmento1.getTotalDivulgacion() * 100)
							/ total);
			segmento1.setPorcenInsumos((segmento1.getTotalInsumos() * 100)
					/ total);
			segmento1.setPorcenPapeleria((segmento1.getTotalPapeleria() * 100)
					/ total);
			segmento1
					.setPorcenRefrigerios((segmento1.getTotalRefrigerios() * 100)
							/ total);
			segmento1
					.setPorcenTransporte((segmento1.getTotalTransporte() * 100)
							/ total);
			segmento1.setPorcenTotal((segmento1.getTotal() * 100) / total);

			segmento2.setPorcenCorreo((segmento2.getTotalCorreo() * 100)
					/ total);
			segmento2
					.setPorcenDivulgacion((segmento2.getTotalDivulgacion() * 100)
							/ total);
			segmento2.setPorcenInsumos((segmento2.getTotalInsumos() * 100)
					/ total);
			segmento2.setPorcenPapeleria((segmento2.getTotalPapeleria() * 100)
					/ total);
			segmento2
					.setPorcenRefrigerios((segmento2.getTotalRefrigerios() * 100)
							/ total);
			segmento2
					.setPorcenTransporte((segmento2.getTotalTransporte() * 100)
							/ total);
			segmento2.setPorcenTotal((segmento2.getTotal() * 100) / total);

			segmento3.setPorcenCorreo((segmento3.getTotalCorreo() * 100)
					/ total);
			segmento3
					.setPorcenDivulgacion((segmento3.getTotalDivulgacion() * 100)
							/ total);
			segmento3.setPorcenInsumos((segmento3.getTotalInsumos() * 100)
					/ total);
			segmento3.setPorcenPapeleria((segmento3.getTotalPapeleria() * 100)
					/ total);
			segmento3
					.setPorcenRefrigerios((segmento3.getTotalRefrigerios() * 100)
							/ total);
			segmento3
					.setPorcenTransporte((segmento3.getTotalTransporte() * 100)
							/ total);
			segmento3.setPorcenTotal((segmento3.getTotal() * 100) / total);

			bitacora5Presupuesto.setPorcentajeTotal((total * 100) / total);
			bitacora5Presupuesto.setTotal(total);
			bitacora5dao.update(bitacora5Presupuesto);
			segmentoDAO.update(segmento1);
			segmentoDAO.update(segmento2);
			segmentoDAO.update(segmento3);
		}
		
		

		return creado;
	}

	public boolean crearActividad(Actividad actividad, long inSeleccionada, boolean estado) {

		boolean creado = true;
		if (estado) {
			actividadDAO = new ActividadDAO(entityManager);
			investigacionDAO = new InvestigacionDAO(entityManager);

			Investigacion investigacion = investigacionDAO
					.findByKey(inSeleccionada);

			Cronograma cronogramaActividades = investigacion.getCronograma();

			actividad.setCronograma(cronogramaActividades);

			actividadDAO.insert(actividad);
		}
		

		return creado;
	}

	public List<Segmento> obtenerSegmentosInvestigaicon(long idBitacora) {
		segmentoDAO = new SegmentoDAO(entityManager);
		return segmentoDAO.segmentosBitacora(idBitacora);
	}

	public List<Actividad> obtenerActividadesInvestigacion(long idInvestigacion) {
		investigacionDAO = new InvestigacionDAO(entityManager);
		return investigacionDAO
				.obtenerActividadesInvestigacion(idInvestigacion);
	}

	public boolean editarActividad(Actividad actividad) {
		actividadDAO = new ActividadDAO(entityManager);
		boolean editado = false;

		Actividad actividad2 = actividadDAO.findByKey(actividad
				.getIdentificacion());

		if (actividad2 != null) {
			actividadDAO.update(actividad);
			editado = true;
		}
		return editado;
	}

	public Asesor obtenerAsesorInvestigacion(long idInvestigacion) {
		investigacionDAO = new InvestigacionDAO(entityManager);

		Asesor asesor;

		List<Asesor> asesoeres = investigacionDAO
				.obtenerAsesorInvestigacion(idInvestigacion);
		if (asesoeres.size() == 0) {
			asesor = new Asesor();
		} else
			asesor = asesoeres.get(0);

		return asesor;
	}

	public List<String> obtenerListaLineas() {
		lineaTematicaDAO = new LineaTematicaDAO(entityManager);
		return lineaTematicaDAO.obtenerListaLineas();
	}

	public List<Consulta> obtenerConsultasInvestigacion(long idInvestigacion) {
		consultaDAO = new ConsultaDAO(entityManager);

		return consultaDAO.obtenerConsultasInvestigacion(idInvestigacion);
	}

	public List<RespuestaConsulta> obtenerRespuestasConsulta(long idConsulta) {
		respuestaConsultaDAO = new RespuestaConsultaDAO(entityManager);
		return respuestaConsultaDAO.obtenerRespuestasConsulta(idConsulta);
	}

	public boolean crearConsulta(Consulta consulta, String destino,
			long idInvestigacion, boolean estado) {
		
		boolean creada = false;
		
		if (estado) {
			investigacionDAO = new InvestigacionDAO(entityManager);
			consultaDAO = new ConsultaDAO(entityManager);

			if (destino.equals("Administrador")) {
				consulta.setAdministrador(true);
			}

			Investigacion investigacion = investigacionDAO
					.findByKey(idInvestigacion);

			if (investigacion != null) {
				consulta.setInvestigacion(investigacion);

				consultaDAO.insert(consulta);
				creada = true;
			}
		}
		

		return creada;
	}

	public boolean asignarLineaTematica(String nombreInvestigacion,
			String nombreLinea, long idInvestigacion) {
		investigacionDAO = new InvestigacionDAO(entityManager);
		lineaTematicaDAO = new LineaTematicaDAO(entityManager);
		boolean actualizado = false;

		LineaTematica lineaTematica = null;
		List<LineaTematica> listaLineas = lineaTematicaDAO.getAll();

		for (LineaTematica lineaTematica2 : listaLineas) {
			if (lineaTematica2.getLinea().equals(nombreLinea)) {
				lineaTematica = lineaTematica2;
				break;
			}
		}

		// if (!nombreLinea.equals("")) {
		// lineaTematica=lineaTematicaDAO.obtenerLineaTematica(nombreLinea);
		// }

		Investigacion investigacion = investigacionDAO
				.findByKey(idInvestigacion);

		if (lineaTematica != null && investigacion != null) {
			investigacion.setNombre(nombreInvestigacion);
			investigacion.setLineaTematica(lineaTematica);
			investigacionDAO.update(investigacion);
			actualizado = true;
		}

		return actualizado;
	}

	public List<ComentarioAsesor> obtenerComentariosAsesor(long idInvestigacion) {
		comentarioAsesorDAO = new ComentarioAsesorDAO(entityManager);
		return comentarioAsesorDAO
				.obtenerComentariosAsesorInvestigacion(idInvestigacion);
	}

	public Encuesta obtenerEncuestaInvestigacion(long idInvestigacion) {
		encuestaDAO = new EncuestaDAO(entityManager);
		Encuesta encuesta = new Encuesta();
		List<Encuesta> encuestas = encuestaDAO.getAll();

		for (Encuesta encuesta2 : encuestas) {
			if (encuesta2.getInvestigacion().getIdentificacion() == idInvestigacion) {
				encuesta = encuesta2;
			}
		}

		return encuesta;
	}

	public boolean crearEncuesta(Encuesta encuesta, long idInvestigacion) {
		encuestaDAO = new EncuestaDAO(entityManager);
		investigacionDAO = new InvestigacionDAO(entityManager);
		boolean creada = false;

		Investigacion investigacion = investigacionDAO
				.findByKey(idInvestigacion);
		Encuesta encuesta2 = encuestaDAO
				.findByKey(encuesta.getIdentificacion());
		if (encuesta2 == null && investigacion != null) {
			encuesta.setInvestigacion(investigacion);
			encuestaDAO.insert(encuesta);
			creada = true;
		}
		// else
		// if (encuesta2!=null && investigacion!=null) {
		// encuesta.setInvestigacion(investigacion);
		// encuestaDAO.update(encuesta);
		// creada=true;
		// }
		return creada;
	}

	public List<Comentario> obtenerComentariosInvestigacion(long idInvestigacion) {
		comentarioDAO = new ComentarioDAO(entityManager);
		return comentarioDAO.obtenerComentariosInvestigacion(idInvestigacion);
	}

	public List<RespuestaComentario> obtenerRespuestasComentario(
			long idComentario) {
		respuestaComentarioDAO = new RespuestaComentarioDAO(entityManager);
		return respuestaComentarioDAO.obtenerRespuestasComentario(idComentario);
	}

	public boolean crearComentario(Comentario comentario, long idInvestigacion) {
		comentarioDAO = new ComentarioDAO(entityManager);
		investigacionDAO = new InvestigacionDAO(entityManager);
		boolean creado = false;

		Investigacion investigacion = investigacionDAO
				.findByKey(idInvestigacion);

		if (investigacion != null) {
			comentario.setInvestigacion(investigacion);
			comentarioDAO.insert(comentario);
			creado = true;
		}
		return creado;
	}

	public List<ResumenComentarioDTO> obtenerResumenComentarios(
			long idInvestigacion) {
		investigacionDAO = new InvestigacionDAO(entityManager);
		comentarioDAO = new ComentarioDAO(entityManager);
		String linea = investigacionDAO
				.obtenerLineaInvestigacion(idInvestigacion);
		return comentarioDAO.obtenerResumenComentarios(idInvestigacion, linea);
	}

	public boolean crearRespuestaComentarioGrupo(RespuestaComentario respuesta,
			long idComentario) {
		respuestaComentarioDAO = new RespuestaComentarioDAO(entityManager);
		comentarioDAO = new ComentarioDAO(entityManager);
		boolean creada = false;

		Comentario comentario = comentarioDAO.findByKey(idComentario);

		if (comentario != null) {
			respuesta.setComentario(comentario);
			respuestaComentarioDAO.insert(respuesta);
			creada = true;
		}
		return creada;
	}

	public Bitacora2 getBitacora2(long idInvestigacion) {
		investigacionDAO = new InvestigacionDAO(entityManager);
		List<Bitacora2> listBitacora2 = investigacionDAO
				.getBitacota2Investigacion(idInvestigacion);
		Bitacora2 bitacora2 = new Bitacora2();

		if (listBitacora2.size() != 0) {
			bitacora2 = listBitacora2.get(0);
		}
		return bitacora2;
	}

	public Bitacora3 getBitacora3(long idInvestigacion) {
		investigacionDAO = new InvestigacionDAO(entityManager);
		List<Bitacora3> listbBitacora3 = investigacionDAO
				.getBitacota3Investigacion(idInvestigacion);
		Bitacora3 bitacora3 = new Bitacora3();

		if (listbBitacora3.size() != 0) {
			bitacora3 = listbBitacora3.get(0);
		}
		return bitacora3;
	}

	public Bitacora1Maestro getBitacora1Maestro(long idInvestigacion) {
		investigacionDAO = new InvestigacionDAO(entityManager);
		List<Bitacora1Maestro> listBitacora1Maestro = investigacionDAO
				.getBitacota1MaestroInvestigacion(idInvestigacion);
		Bitacora1Maestro bitacora1Maestro = new Bitacora1Maestro();

		if (listBitacora1Maestro.size() != 0) {
			bitacora1Maestro = listBitacora1Maestro.get(0);
		}
		return bitacora1Maestro;
	}

	public Bitacora2Maestro getBitacora2Maestro(long idInvestigacion) {
		investigacionDAO = new InvestigacionDAO(entityManager);
		List<Bitacora2Maestro> listBitacora2Maestro = investigacionDAO
				.getBitacota2MaestroInvestigacion(idInvestigacion);
		Bitacora2Maestro bitacora2Maestro = new Bitacora2Maestro();

		if (listBitacora2Maestro.size() != 0) {
			bitacora2Maestro = listBitacora2Maestro.get(0);
		}
		return bitacora2Maestro;
	}

	public Bitacora3Maestro getBitacora3Maestro(long idInvestigacion) {
		investigacionDAO = new InvestigacionDAO(entityManager);
		List<Bitacora3Maestro> listBitacora3Maestro = investigacionDAO
				.getBitacota3MaestroInvestigacion(idInvestigacion);
		Bitacora3Maestro bitacora3Maestro = new Bitacora3Maestro();

		if (listBitacora3Maestro.size() != 0) {
			bitacora3Maestro = listBitacora3Maestro.get(0);
		}
		return bitacora3Maestro;
	}
	
	public Bitacora4Maestro obtenerBitacora4Maestro(long idInvestigacion) {
		investigacionDAO=new InvestigacionDAO(entityManager);
		List<Bitacora4Maestro>lista=investigacionDAO.getBitacota4MaestroInvestigacion(idInvestigacion);
		Bitacora4Maestro bitacora4Maestro=new Bitacora4Maestro();
		if (lista.size()!=0) {
			bitacora4Maestro=lista.get(0);
		}
		return bitacora4Maestro;
	}

	public List<Estudiante> obtenerEstudiantesGrupo(String loginGrupo) {
		estudianteDAO=new EstudianteDAO(entityManager);
		return estudianteDAO.obtenerEstudiantesGrupo(loginGrupo);
	}

	public List<Maestro> obtenerMaestrosGrupo(String loginGrupo) {
		maestroDAO=new MaestroDAO(entityManager);
		return maestroDAO.obtenerMaestrosGrupo(loginGrupo);
	}

	public boolean editarEstudiante(Estudiante estudiante) {
		estudianteDAO=new EstudianteDAO(entityManager);
		Estudiante estudiante2=estudianteDAO.findByKey(estudiante.getIdentificacion());
		boolean editado=false;
		
		if (estudiante2!=null) {
			estudianteDAO.update(estudiante);
			editado=true;
		}
		return editado;
	}

	public boolean eliminarEstudiante(Estudiante estudiante) {
		estudianteDAO=new EstudianteDAO(entityManager);
		Estudiante estudiante2=estudianteDAO.findByKey(estudiante.getIdentificacion());
		boolean eliminado=false;
		
		if (estudiante2!=null) {
			estudianteDAO.remove(estudiante);
			eliminado=true;
		}
		return eliminado;
	}

	public boolean editarMaestro(Maestro maestro) {
		maestroDAO =new MaestroDAO(entityManager);
		Maestro maestro2=maestroDAO.findByKey(maestro.getIdentificacion());
		boolean editado=false;
		
		if (maestro2!=null) {
			maestroDAO.update(maestro);
			editado=true;
		}
		return editado;
	}

	public boolean eliminarMaestro(Maestro maestro) {
		maestroDAO =new MaestroDAO(entityManager);
		Maestro maestro2=maestroDAO.findByKey(maestro.getIdentificacion());
		boolean eliminado=false;
		
		if (maestro2!=null) {
			maestroDAO.remove(maestro);
			eliminado=true;
		}
		return eliminado;
	}
	
	public Convocatoria obtenerConvocatoriaActiva()
	{
		convocatoriaDAO=new ConvocatoriaDAO(entityManager);
		List<Convocatoria>lista=convocatoriaDAO.obtenerConvocatoriaActiva();
		Convocatoria convocatoria=new Convocatoria();
		if (lista.size()!=0) {
			convocatoria=lista.get(0);
		}
		return convocatoria;
	}
	
	public InformeFinal obtenerInformeFinal(long idInvestigacion)
	{
		investigacionDAO=new InvestigacionDAO(entityManager);
		
		List<InformeFinal>lista=investigacionDAO.obtenerInformeFinalInvestigacion(idInvestigacion);
		InformeFinal informeFinal=new InformeFinal();
		if (lista.size()!=0) {
			informeFinal=lista.get(0);
		}
		return informeFinal;
	}
	
	public InformeAvanceTecnico obtenerAvanceTecnico(long idInvestigacion) {
		investigacionDAO=new InvestigacionDAO(entityManager);
		
		List<InformeAvanceTecnico> lista=investigacionDAO.obtenerInformeAvanceTecnico(idInvestigacion);
		InformeAvanceTecnico informeAvanceTecnico=new InformeAvanceTecnico();
		if (lista.size()!=0) {
			informeAvanceTecnico=lista.get(0);
		}
		return informeAvanceTecnico;
	}
	
	public boolean crearInformeFinal(InformeFinal informeFinal, long inSeleccionada, boolean estado)
	{
		boolean creado = true;
		if (estado) {
			informeFinalDAO = new InformeFinalDAO(entityManager);

			investigacionDAO = new InvestigacionDAO(entityManager);

			if (informeFinal.getIdentificacion() != 0) {
				informeFinalDAO.update(informeFinal);
			} else {
				informeFinalDAO.insert(informeFinal);

				Investigacion investigacion = investigacionDAO
						.findByKey(inSeleccionada);

				investigacion.setInformeFinal(informeFinal);

				investigacionDAO.update(investigacion);
			}
		}
		
		return creado;
	}

}
